# -*- coding: utf-8 -*-
# @Time : 2022-05-26 15:41
# @Author : Z
# @Function :


# 冒泡排序:如果前一个比自己大，就交换,直到将最大的数放到最右边，结束第一轮循环，然后再进行第二轮循环，知道结束
arr = [11, 22, 5, 8, 12, 9]

# 冒泡排序:如果前一个比自己大，就交换,直到将最大的数放到最右边，结束第一轮循环，然后再进行第二轮循环，知道结束
# 第一伦：2  5  8  11  9    12     比较次数：i-1 6个数字，比较5次，最大值放到最右边
# 第二伦：2  5  8  9    11  12    比较次数：i-2  5个数字，比较4次，倒数第二大放到倒数第二位
# 第三轮：2  5  8    9  11  12     比较次数：i-3
# 第四轮：2  5    8  9  11  12      比较次数：i-4
# 第五轮：2    5  8  9  11  12     比较次数：i-5
# 6个数字，比较5轮，
def dubble_sort(ll):
    # 比较轮次，5次
    for i in range(1, len(ll)):
        # 比较的次数，每比一轮，就减少一个数比较
        for j in range(0, len(ll) - i):
            # 如果前一个数比后一个数大，则交换
            if ll[j] > ll[j + 1]:
                ll[j], ll[j + 1] = ll[j + 1], ll[j]
    print(ll)

aa = [11,8,10,6]
l = [2, 33, 12, 34, 9, 12]
dubble_sort(l)
dubble_sort(aa)

# 选择排序
# 第一轮比较：先默认第一个数字为最小值
# 如果第一个数字比第二个数字大，则记录第二个数字的下标，用第二个数，再和后面的比，
# 如果第二个比三个数小，则不用记录，
# 继续比较，直到比较完所有的数字，找出最小值，将最小值和第一位交换位置，
b = [9, 2, 1, 34, 8, 12]
# 比较轮次 i=len(a)-1=5     从第一个数字开始比较，
# 第一轮：1  2 9 34 8 12    比较次数i-1  6个数字，比较5次， 最小值放到最左边 第一轮结束，从第二个数字开始比较
# 第二轮：1 2  9 34 8 12    比较次数i-2  5个数字，比较4次 最小值放到最左边第二位 第二轮结束，从第三个数字开始比较
# 第三轮：1 2 8  34 9 12    比较次数i-3  4个数字，比较3次 最小值放到最左边第三位 第三轮结束，从第四个数字开始比较
# 第四轮：1 2 8 9  34 12    比较次数i-4  3个数字，比较2次 最小值放到最左边第四位 第四轮结束，从第五个数字开始比较
# 第五轮：1 2 8 9 12  34    比较次数i-5  2个数字，比较1次 最小值放到最左边第五位 第五轮结束，从第六个数字开始比较，
# 但第六个字后面已经没有数字，不需要再进行比较

# def select_sort(a):
#     # 比较轮次,5次,range要头不要尾 range(0,6)  0,1,2,3,4,5
#     for i in range(0, len(a) - 1):
#         # 先默认第一个数字为最小值下标，
#         min_index = i
#         # 每轮比较次数
#         for j in range(i + 1, len(a)):
#             # 找出最小值的下标
#             if a[min_index] > a[j]:
#                 # 交换最小值的小标，使用当前找到的最小值，继续和后续的数字进行比较，直到所有数字比较完
#                 min_index = j
#         # 将找出的最小值和第i位数字进行交换
#         a[i], a[min_index] = a[min_index], a[i]
#     print(a)


# c = [9, 2, 1, 34, 8, 12]
# select_sort(c)
#
# # 字符串反转
# a1 = "abcdef"
# a=list(a1)
# print(a)
# print("反转后的列表："+str(a[::-1]))


a = "1234567"
# 通过for循环反转
# 单数交换次数：比较 len(a)/2   3次  需要取整  int(len(a)/2)
# 比较次数，1和7 交换， 2和6 交换， 3和5 交换  4 不用交换
# 双数交换次数 len(a)/2   4次  需要取整  int(len(a)/2)
# 比较次数：1和8 交换， 2和7 交换， 3和6 交换  4和5交换，交换4次
# ll = list(a)
# # 比较次数
# for i in range(int(len(ll)/2)):
#     ll[i],ll[len(ll)-i-1]=ll[len(ll)-i-1],ll[i]
# print(ll)
# # 通过join将列表转为字符串
# string="".join(ll)
# print(string)
#
# b = "1234567"
# bb=list(b)
# print(bb)
# bb.reverse()
# print("".join(bb))

# 九九乘法表
# for i in range(1, 10):
#     for j in range(1, i + 1):
#         # 不换行输出,tab键隔开
#         print(str(i) + "*" + str(j) + "=" + str(i * j), end="\t")
#     # 完成一次后换行
#     print()
# print()
#
# i = 1
# while i < 10:
#     j = 1
#     while j < 10:
#         # 不换行输出,tab键隔开
#         print(str(i) + "*" + str(j) + "=" + str(i * j), end="\t")
#         j += 1
#         if j > i:
#             # 结束本次循环，跳出当前的循环
#             break
#     print()
#     i += 1


# 迭代器
# 迭代是Python最强大的功能之一，是访问集合元素的一种方式。
# 迭代器是一个可以记住遍历的位置的对象。
# 迭代器对象从集合的第一个元素开始访问，直到所有的元素被访问完结束。迭代器只能往前不会后退。
# 迭代器有两个基本的方法：iter() 和 next()。
# 字符串，列表或元组对象都可用于创建迭代器：
a = [1,3,4,2,0]
it = iter(a)
# print(next(it))
# print(next(it))
for x in it:
    print(x,end=" ")

import sys

# 生成器函数 - 斐波那契
def fibonacci(n):
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1


f = fibonacci(10)  # f 是一个迭代器，由生成器返回生成

while True:
    try:
        print(next(f), end=" ")
    except StopIteration:
        sys.exit()

